#include "pool.h"

/* 管理者线程执行的方法 */
void ThreadPool::managerRun() {
    while (1) {
        // 管理者线程被唤醒  消耗一个信号量
        sem_wait(&sem_manager);

        // 选择工作模式
        switch (mode) {
            case EMPTY:
                fprintf(stderr, "管理者线程的工作模式是EMPTY\n");
                break;
            case TASK: // 来任务了，给线程分配任务
                this->task();
                break;
            default:
                fprintf(stderr, "管理者线程的工作模式不在枚举类中\n");
                break;
        }
    }
}

void ThreadPool::createThread() {
    thread* _thread = new thread(&ThreadPool::exec, this);
    this->cur++; // 当前线程数
    this->leisure++; // 空闲线程数
    this->taskThread[_thread->get_id()] = _thread; // 把线程加到线程集合中
}

void ThreadPool::task() {
    // 看看现在线程池里有没有线程
    if (cur == 0) { // 没有线程就创建
        this->createThread();
    } else
    // 再看有没有空闲的线程
    if (leisure == 0) {
        if (cur < core) { // 当前线程数 < 核心线程数
            this->createThread();
        } else {
            if (cur < max && taskQueue.size() >= TASE_QUEUE_SIZE) {
                // 如果任务队列中，任务太多了，就再创建线程进行处理
                this->createThread();
            }
            // 让任务先在队列里，等待线程空闲
            mode = TASK;
            sem_post(&sem_manager);
            return;
        }
    }

    // 随机给一个空闲线程分配任务
    leisure--; // 减少一个空闲线程
    sem_post(&sem_task);
}